/*
		误差值计算

		夏思成

		2024年3月27日

		西科大15号公寓楼
*/


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//平均值函数
double average(double* nums, size_t numsSize)
{
	double sum = 0;
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		sum += nums[i];
	}
	return (int)(sum / numsSize * 1000 + 0.5 )/ 1000.0;
}

//计算标准偏差(Ua)函数
double Ua(double* nums, size_t numsSize, double aver)
{
	//创建一个动态空间用于存储残差(每个数据与平均数的差值)
	double* residual = (double*)malloc(sizeof(double) * 6);

	//计算残差并储存在动态空间residual中
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		residual[i] = nums[i] - aver;
	}

	//计算标准偏差(Ua)
	double sum = 0;
	for (i = 0; i < numsSize; i++)
	{
		sum += pow(residual[i], 2);
	}
	sum /= (numsSize * (numsSize - 1));
	return (int)(sqrt(sum) * 100000 + 0.5) / 100000.0;
}

//Ub函数
double Ub(double machine, double k)
{
	return (int)(machine / k * 10000 + 0.5) / 10000.0;
}

//Uc函数
double Uc(double ua, double ub)
{
	return (int)(sqrt(pow(ua, 2) + pow(ub, 2)) * 100000 + 0.5) / 100000.0;
}

//Ucrel函数
double Ucrel(double Uc, double aver)
{
	return (int)(Uc / aver * 100000 + 0.5) / 100000.0 * 100;
}

int main()
{
	double nums[6] = { 0 };
	size_t numsSize = sizeof(nums) / sizeof(nums[0]);

	printf("请输入6个数据\n");
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		scanf("%lf", &nums[i]);
	}

	//平均值函数
	double aver = average(nums, numsSize);

	//计算标准偏差(Ua)函数
	double ua = Ua(nums, numsSize, aver);

	//Ub函数
	double machine = 0;
	double k = 0;
	//printf("请输入仪器误差和k值\n");
	//scanf("%f %f", &machine, &k);
	//double ub = Ub(machine, k);
	double ub = 0.05;//已知

	//标准不确定度函数(Uc)
	double uc = Uc(ua, ub);

	//计算Ucrel
	double ucrel = Ucrel(uc, aver);

	//打印结果
	printf("average = %lf\n", aver);
	printf("Ua = %0.5lf\n", ua);
	printf("Ub = %lf\n", ub);
	printf("Uc = %0.5lf\n", uc);
	printf("测量结果为：\n");
	printf("x = %lf +/- %0.5lf\n", aver, uc);
	printf("Ucrel = %0.3lf%%", ucrel);
	return 0;
}

//
//int main()
//{
//	double a = 1.3235;
//	printf("%.3lf", a);
//	return 0;
//}